package cn.tk.service.mr;

import cn.tk.model.pojo.mr.engine.ClarifyItem;
import cn.tk.model.pojo.mr.engine.MrSession;
import cn.tk.model.pojo.mr.flow.ContextPair;
import cn.tk.model.pojo.mr.nlu.NluResp;

import java.util.List;
import java.util.Map;

/**
 * Created by denglw on 2021/8/7.<br/>
 * Desc: 会话服务层
 */
public interface SessionService {

    /**
     * 是否存在某会话.<br/>
     * @param userId 用户id
     * @param sessionId 会话id
     * @return bool
     */
    boolean existSession(String userId, String sessionId);

    /**
     * 删除指定用户的会话数据.<br/>
     * @param userId 用户ID
     * @param sessionId 会话ID
     */
    void delete(String userId, String sessionId);

    /**
     * 保存会话消息轮次信息，如果存在则更新.<br/>
     * @param round 会话轮次
     */
    void saveRound(MrSession.Round round);

    /**
     * 获取上一轮次的交互详情.<br/>
     * @return 上一轮交互
     */
    MrSession.Round fetchLastRound();

    /**
     * 获取当前轮次的交互详情.<br/>
     * @return 当前交互
     */
    MrSession.Round fetchCurrRound();

    /**
     * 会话最大轮次号.<br/>
     * @return 轮次号
     */
    int maxSerialNo();

    /**
     * 获取当前会话所有的轮次信息.<br/>
     * @return 轮次list
     */
    List<MrSession.Round> fetchRounds();

    /**
     * 获取指定会话的轮次信息.<br/>
     * @param userId 用户id
     * @param sessionId 会话id
     * @return 轮次list
     */
    List<MrSession.Round> fetchRounds(String userId, String sessionId);

    /**
     * 获取当前会话的消息上下文.<br/>
     * @return 列表
     */
    List<String> messageContext();

    /**
     * 获取节点在会话中已经匹配的次数.<br/>
     * @param nodeId 节点id
     * @return 次数
     */
    int getRepeatNum(Long nodeId);

    /**
     * 获取会话的参数上下文.<br/>
     * @return 上下文
     */
    List<ContextPair> getContextPairs();

    /**
     * 实体澄清情况列表.<br/>
     * @param entityNodeId 实体节点
     * @return list
     */
    List<ClarifyItem> getClarifyItems(Long entityNodeId);

    /**
     * 获取流程采集的所有信息.<br/>
     * @return map
     */
    Map<String, String> getCollects();

    /**
     * 获取轮次的递归次数，并新增一次，防止无限循环.<br/>
     * @param messageId 消息id
     * @param keyRandom 随机key部分
     * @return 递归次数
     */
    int getAndIncrRecursionNum(String messageId, String keyRandom);

    /**
     * 获取当前会话历史轮次的所有模型识别实体结果.<br/>
     * @return list
     */
    List<NluResp.InnerEntity> getNluEntities();
}
